#include <msgUtils.h>
#include <glib.h>
#include <pthread.h>
#include "curlRequest.h"

// 配置请求的响应处理
size_t configHandle(void *content, size_t size, size_t n, void *res)
{
    char *result = (char *)content;
    g_print("%s\n", result);
    // 解析得到cJson对象（ROOT对象）
    cJSON *root = cJSON_Parse(result);
    if (cJSON_IsObject(root))
    {
        // 子属性对象
        cJSON *successJson = cJSON_GetObjectItemCaseSensitive(root, "success");
        cJSON *messageJson = cJSON_GetObjectItemCaseSensitive(root, "msg");
        cJSON *codeJson = cJSON_GetObjectItemCaseSensitive(root, "code");
        if (cJSON_IsTrue(successJson))
        {
            // 获取字符串属性值
            printf("成功！msg=%s,code=%s\n", messageJson->valuestring, codeJson->valuestring);
        }
        else
        {
            printf("失败！msg=%s,code=%s\n", messageJson->valuestring, codeJson->valuestring);
        }
    }
    return size * n;
}

void sendConfigRequest()
{
    // 1 从文件中读取配置信息
    // 获取配置信息的文件路径
    GKeyFile *configKeyFile = g_key_file_new();
    if (!g_key_file_load_from_file(configKeyFile, "./config.ini", G_KEY_FILE_NONE, NULL))
    {
        g_warning("load config.ini error!");
        // return -1;
    }
    gchar *deviceInfoPath = g_key_file_get_string(configKeyFile, "config", "deviceInfoPath", NULL);
    g_key_file_free(configKeyFile);

    GKeyFile *deviceInfoFile = g_key_file_new();
    if (!g_key_file_load_from_file(deviceInfoFile, deviceInfoPath, G_KEY_FILE_NONE, NULL))
    {
        g_warning("load deviceInfo.ini error!");
        // return -1;
    }
    gchar *gatewayIp = g_key_file_get_string(deviceInfoFile, "config", "gatewayIp", NULL);
    gchar *location = g_key_file_get_string(deviceInfoFile, "config", "location", NULL);
    gchar *sn = "jjfjjfjf";
    g_key_file_free(deviceInfoFile);
    // 2 发请求
    // 2.0 地址 http://gatewayIp:80/services/device/config.json
    char *url = calloc(100, sizeof(char));
    sprintf(url, "http://%s/services/device/config.json", gatewayIp);
    g_print("%s\n", url);
    // 2.1 获取参数  地址  sn  gatewayIp
    char *parm = calloc(100, sizeof(char));
    sprintf(parm, "sn=%s&location=%s", sn, location);
    g_print("%s\n", parm);
    // 2.2 发请求
    sendGet(url, parm, configHandle);
    free(url);
    free(parm);
}

// 做配置的线程，需要再里面不断收消息
void *doConfig(void *)
{
    // 获取配置信息的文件路径
    GKeyFile *configKeyFile = g_key_file_new();

    if (!g_key_file_load_from_file(configKeyFile, "./config.ini", G_KEY_FILE_NONE, NULL))
    {
        g_warning("load config.ini error!");
        // return -1;
    }
    gchar *deviceInfoPath = g_key_file_get_string(configKeyFile, "config", "pathName", NULL);
    g_key_file_free(configKeyFile);
    // 获取消息队列id
    int msgQueueId = obtain_msg_queue(deviceInfoPath, ADS_BOA_MAIN_ID);
    g_print("obtain_msg_queue id %d\n", msgQueueId);
    if (msgQueueId == -1)
    {
        // g_warning("load config.ini error!");
        // return -1;
    }
    Msg msg = {};
    while (msgrcv(msgQueueId, (void *)&msg, 64, 100, 0))
    {
        // 1 收消息成功
        g_print("msgtype:%ld,content:%s\n", msg.type, msg.content);
        // 2发请求到服务端做配置
        // 2.0 地址 http://gatewayIp:80/services/device/config.json
        // 2.1 获取参数  地址  sn  gatewayIp
        // 2.2 发请求
        sendConfigRequest();
    }
}
int main(int argc, char const *argv[])
{
    // 不断收消息 收消息是阻塞的，会阻塞主线程的执行。 开一个子线程来执行。 在子线程阻塞不影响主线程的执行。
    pthread_t tid;
    int retVal = pthread_create(&tid, NULL, doConfig, NULL);
    if (retVal != 0)
    {
        g_error("pthread_create error!\n");
        return -1;
    }

    // 心跳
    while (TRUE)
    {
        sleep(5000);
        g_print("hearts......................\n");
    }
    return 0;
}
